﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Refeicoes;
using Model.Requisicoes;
using Model.Contratos;
using Model.Tipologias;
using Services.Refeicoes;

namespace welwitschia.Requisicoes
{
    public partial class RequisicaoDetalhe : PaginaBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (!String.IsNullOrEmpty(Request.QueryString["uid"]) && !String.IsNullOrEmpty(Request.QueryString["dt"]) )
                {
                    Requisicao requisicao = null;
                    IList<Refeicao> lRefeicao = RefeicaoService.ObterRefeicoesContratadas(
                        Convert.ToInt64(Request.QueryString["uid"]),
                        DateTime.ParseExact(Request.QueryString["dt"],"yyyyMMdd", null));

                    if (lRefeicao.Count == 0)
                        throw new Exception("Não existe contrato de serviço de refeições para esta unidade");

                     IRequisicaoService requisicaoService = new RequisicaoService();
                     IList<Requisicao> lRequisicao = requisicaoService.ObterTodosPorUnidadeData(
                                                                Convert.ToInt64(Request.QueryString["uid"]),
                                                                DateTime.ParseExact(Request.QueryString["dt"], "yyyyMMdd", null));
                    
                     if (lRequisicao.Count > 1)
                            throw new Exception("Existem várias requisições para esta data para a mesma unidade.");

                    if (lRefeicao[0].DataRefeicao == DateTime.MinValue)
                    {
                        if (lRequisicao.Count > 0)
                            throw new Exception("Já existe uma requisição para esta data e para esta unidade.");

                        requisicao = new Requisicao();
                        requisicao.DataRequisicao = DateTime.ParseExact(Request.QueryString["dt"], "yyyyMMdd", null);
                        requisicao.Unidade = lRefeicao[0].RefeicaoContratada.Contrato.Unidade;

                        requisicao = requisicaoService.Insere(requisicao);
                        
                        IContratoService contratoService = new ContratoService();
                        
                        foreach (Refeicao r in lRefeicao)
                        {
                            r.DataRefeicao = DateTime.ParseExact(Request.QueryString["dt"], "yyyyMMdd", null);
                            IList<OpcaoRefeicaoContrato> lOpcaoRefeicaoContrato = 
                                contratoService.ObterTodosOpcaoPorRefeicaoContratada(r.RefeicaoContratada.IdRefeicaoContratada);

                            r.OpcoesRefeicao = new List<RefeicaoOpcao>();
                            foreach (OpcaoRefeicaoContrato or in lOpcaoRefeicaoContrato)
                            {
                                r.OpcoesRefeicao.Add(new RefeicaoOpcao()
                                {
                                    Refeicao = r,
                                    Descricao = String.Empty,
                                    TipoOpcao = or.TipoOpcao
                                });
                            }

                            IList<RefeicaoUnidade> lRefeicaoUnidade = RefeicaoService.ObterRefeicaoUnidadeContratadas(r);

                            r.UnidadeRefeicao = lRefeicaoUnidade;
                            r.CodEstadoRefeicao = "abr";
                            r.NumeroRequisicao = requisicao.NumeroRequisicao;
                        }
                        RefeicaoService.Insere(lRefeicao);

                    }
                    else
                    {
                        requisicao = lRequisicao[0];
                    }

                    ModelParaView(lRefeicao, requisicao);
                }
                else 
                {
                    throw new Exception("Parametro não identificado."); 
                }
            }
        }


        protected void btnEmitir_Click(object sender, EventArgs e)
        {
            try
            {
                IRequisicaoService requisicaoService = new RequisicaoService();
                Requisicao requisicao = requisicaoService.ObterPorNumeroRequisicao(Convert.ToInt64(hfNumeroRequisicao.Value));
                requisicao = ViewParaModel(requisicao);
                requisicaoService.Actualiza(requisicao);

                IList<Refeicao> lRefeicao = RefeicaoService.ObterRefeicoesContratadas(
                       Convert.ToInt64(hfIdUnidade.Value),
                       Convert.ToDateTime(txtDataRequisicao.Text));

                foreach (Refeicao r in lRefeicao)
                {
                    r.CodEstadoRefeicao = "req";
                    RefeicaoService.Actualiza(r); 
                }

                Response.Redirect(@"~\Relatorios\RequisicaoInternaControler.aspx?nrid=" + hfNumeroRequisicao.Value);
            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Requisicoes\RequisicaoEscolha.aspx");
        }


        private Requisicao ViewParaModel( Requisicao requisicao)
        {
            //refeicao.DataRequisicao = Convert.ToDateTime(txtDataRequisicao.Text);
            //refeicao.Unidade = new Unidade() { IdUnidade = Convert.ToInt64(ddlUnidade.SelectedValue) };
            requisicao.Gerente = txtGerente.Text;
            requisicao.ResponsavelRecepcaoProduto = txtResponsavelRecepcaoProdutos.Text;
            return requisicao;
        }


        private void ModelParaView(IList<Refeicao> lRefeicao, Requisicao requisicao)
        {
            txtDataRequisicao.Text = lRefeicao[0].DataRefeicao.ToString("d");
            txtGerente.Text = requisicao.Gerente;
            txtResponsavelRecepcaoProdutos.Text = requisicao.ResponsavelRecepcaoProduto;
            txtCodCliente.Text = lRefeicao[0].RefeicaoContratada.Contrato.Cliente.IdCliente.ToString();
            txtCliente.Text = lRefeicao[0].RefeicaoContratada.Contrato.Cliente.Nome;
            hfIdUnidade.Value = lRefeicao[0].RefeicaoContratada.Contrato.Unidade.IdUnidade.ToString();
            txtUnidade.Text = lRefeicao[0].RefeicaoContratada.Contrato.Unidade.Designacao;
            hfNumeroRequisicao.Value = requisicao.NumeroRequisicao.ToString();

            Decimal totalCustos = 0;
            Decimal totalProveitos = 0;
            foreach (Refeicao r in lRefeicao)
            {
                totalProveitos += r.TotalVendasPrevisto.HasValue ? r.TotalVendasPrevisto.Value : 0;
                totalCustos += r.TotalCustosPrevisto.HasValue ? r.TotalCustosPrevisto.Value : 0;
                if (r.CodEstadoRefeicao == "abr")
                    btnEmitir.Enabled = false;
            }

            pbTotalCustosPrevistos.Amount = totalCustos;
            pbTotalVendasPrevistas.Amount = totalProveitos;
            if(totalProveitos!=0)
                pbRacioTotalUnidade.Amount = (totalCustos / totalProveitos);

            lvRefeicoes.DataSource = lRefeicao;
            lvRefeicoes.DataBind();
        }

        #region Eventos listView lvRefeicoes

        protected void lvRefeicoes_ItemDeleting(object sender, ListViewDeleteEventArgs e)
        {
        }

        protected void lvRefeicoes_ItemEditing(object sender, ListViewEditEventArgs e)
        {
        }

        protected void lvRefeicoes_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            try
            {
                IRequisicaoService requisicaoService = new RequisicaoService();
                Requisicao requisicao = requisicaoService.ObterPorNumeroRequisicao(Convert.ToInt64(hfNumeroRequisicao.Value));
                requisicao = ViewParaModel(requisicao);
                requisicaoService.Actualiza(requisicao);


                if (e.CommandName == "Edit")
                    Response.Redirect(String.Format("~\\Requisicoes\\RequisicaoOpcoes.aspx?rcid={0}&dt={1}&nr={2}&uid={3}",
                        e.CommandArgument.ToString(), Convert.ToDateTime(txtDataRequisicao.Text).ToString("yyyyMMdd"),
                                                                          hfNumeroRequisicao.Value, hfIdUnidade.Value));
            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }
        }

        #endregion
    }
}